home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / MYUTIL / MOVE_SR.M < prev    next >
Encoding:
Text File  |  1990-06-10  |  3.6 KB  |  144 lines

  1. MODULE MOVE_SR;
  2. (*$L-,N+,M-*)
  3.  
  4. FROM SYSTEM IMPORT LONGWORD;
  5.  
  6. (*
  7.  * Emulator für MOVE from SR
  8.  *
  9.  * Funktionsprinzip: Die Instr. wird im Supervisor-Mode ausgeführt.
  10.  *
  11.  * >> Kann gar nicht funktionieren, weil dann auch gleich das gesetzte
  12.  *    S-Bit mit übernommen wird, was ja gar nicht beabsichtigt ist.
  13.  *    Außerdem ist noch ein Fehler drin: Auf dem USP verbleiben 4 Byte!
  14.  *
  15.  * Ohne M2Init linken!
  16.  *)
  17.  
  18. CONST (* XBIOS functions *)
  19.       Supexec   = 38;
  20.       (* GEMDOS functions *)
  21.       PtermRes  = $31;
  22.       PrintLine = $09;
  23.  
  24.       (* base page constants *)
  25.       codestart = 8;
  26.       codelen   = 12;
  27.       datastart = 16;
  28.       datalen   = 20;
  29.       bssstart  = 24;
  30.       bsslen    = 28;
  31.       parent    = 36;
  32.  
  33. VAR old20, oldA0, oldSSP, old24: LONGWORD;
  34.  
  35. PROCEDURE trcExc;
  36.   BEGIN
  37.     ASSEMBLER
  38.         MOVE.L  A0,oldA0
  39.         MOVE.L  oldSSP,A0
  40.         ADDQ.L  #2,A7           ; SR wieder vom USP runterholen
  41.         MOVE.L  (A7)+,2(A0)     ; neuen PC setzen, altes SR erhalten
  42.         ADDQ.L  #2,A7           ; SF vom USP runterholen
  43.         MOVE.L  A7,USP
  44.         MOVE.L  A0,A7
  45.         MOVE.L  oldA0,A0
  46.         MOVE.L  old24,$24
  47.         RTE
  48.     END
  49.   END trcExc;
  50.  
  51. PROCEDURE privExc;
  52.   (***** Einsprung bei Privilegsverletzung *****)
  53.   BEGIN
  54.     ASSEMBLER
  55.         ; Prüfen, ob MOVE from SR die Exc. ausgelöst hat
  56.         ; *** fehlt noch!
  57.         
  58.         ; Trace-Vektor umsetzen
  59.         MOVE.L  $24,old24
  60.         MOVE.L  #trcExc,$24
  61.         ; USP nach SP
  62.         MOVE.L  A0,oldA0
  63.         MOVE.L  USP,A0
  64.         MOVE.W  #$0010,-(A0)
  65.         MOVE.L  2(A7),-(A0)     ; PC auf -(USP)
  66.         MOVE.W  (A7),-(A0)      ; SR auf -(USP)
  67.         MOVE.L  A7,oldSSP       ; SSP retten
  68.         MOVE.L  A0,A7           ; USP nach SSP
  69.         MOVE.L  oldA0,A0
  70.         ; Supervisor- und Trace-Bit setzen
  71.         ORI.W   #$A000,(A7)
  72.         RTE
  73.  
  74. rtn:    MOVE.L  old20,-(A7)     ; normalen Exc-Handler anspringen
  75.     END
  76.   END privExc;
  77.  
  78.  
  79. PROCEDURE UseStackFrame (): BOOLEAN;
  80.   BEGIN
  81.     ASSEMBLER
  82.         PEA     a(PC)
  83.         MOVE    #Supexec,-(A7)
  84.         TRAP    #14
  85.         ADDQ.L  #6,A7
  86.         RTS
  87.  
  88.       a MOVE.L  A7,D2
  89.         MOVE.L  $10,D1          ; Illegal Instruction Exc-Vektor
  90.         LEA     b(PC),A0
  91.         MOVE.L  A0,$10
  92.         ILLEGAL                 ; DC.W    $4AFC
  93.       b MOVE.L  A7,D0
  94.         MOVE.L  D2,A7
  95.         SUB.L   D0,D2
  96.         SUBQ.L  #6,D2
  97.         SNE     D0
  98.         ANDI    #1,D0
  99.         MOVE.L  D1,$10
  100.     END
  101.   END UseStackFrame;
  102.  
  103. BEGIN
  104.   ASSEMBLER
  105.         MOVE.L  4(A7),A5        ; Ptr to base page
  106.         
  107.         JSR     UseStackFrame
  108.         TST     D0
  109.         BEQ     no_inst         ; no emulation on 68000
  110.         
  111.         ; set vectors
  112.         PEA     t(PC)
  113.         MOVE    #Supexec,-(A7)
  114.         TRAP    #14
  115.         BRA     c
  116.      t: MOVE.L  $20,old20
  117.         MOVE.L  #privExc,$20
  118.         RTS
  119.      c:
  120.         ; print msg
  121.         PEA     msg_1(PC)
  122.         MOVE.W  #PrintLine,-(A7)
  123.         TRAP    #1
  124.         
  125.         ; install prg
  126.         CLR.W   (A7)            ; exitcode: 0
  127.         MOVE.L  codelen(A5),A0
  128.         ADDA.L  datalen(A5),A0
  129.         ADDA.L  bsslen(A5),A0
  130.         ADDA.W  #256,A0
  131.         MOVE.L  A0,-(A7)        ; total length of static program space
  132.         MOVE.W  #PtermRes,-(A7) ; terminate process and stay resident
  133.         TRAP    #1
  134.  
  135. no_inst:
  136.         CLR.W   -(A7)
  137.         TRAP    #1              ; Pterm0
  138.  
  139. msg_1   DC.B    13,10
  140.         ASC     'MOVE from SR emulator for the Atari TT. Freeware by Thomas Tempelmann'
  141.         DC.B    13,10,0
  142.   END
  143. END MOVE_SR.
  144.